home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 2 / BBS in a box - Trilogy II.iso / Files / Hyper / T / TIFFWindow1.1 / tifft4tables.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-25  |  18.1 KB  |  381 lines  |  [TEXT/KAHL]

  1. /*
  2.  * This software is copyright 1992 by Robert Morris.
  3.  * You may freely redistribute this software as shareware
  4.  * if you do so in the same form as you got it. If you find
  5.  * this software useful, please send $12 to:
  6.  *   Robert Morris
  7.  *   P.O. Box 1044
  8.  *   Harvard Square Station
  9.  *   Cambridge, MA 02238
  10.  *   ecognome@aol.com
  11.  * If you incorporate any of this software in any kind of
  12.  * commercial product, please send $2 per copy distributed
  13.  * to the above address.
  14.  */
  15.  
  16. #include "tifft4tables.h"
  17.  
  18. struct t4word{
  19.     char *word;
  20.     short len;
  21.     short makeup;
  22. };
  23.  
  24. /* white terminating and makeup codes */
  25. static void
  26. makewtab(struct t4word tab[])
  27. {
  28.     int i = 0;
  29.     tab[i].word = "00110101"; tab[i].len = 0; tab[i].makeup = 0; i++;
  30.     tab[i].word = "000111"; tab[i].len = 1; tab[i].makeup = 0; i++;
  31.     tab[i].word = "0111"; tab[i].len = 2; tab[i].makeup = 0; i++;
  32.     tab[i].word = "1000"; tab[i].len = 3; tab[i].makeup = 0; i++;
  33.     tab[i].word = "1011"; tab[i].len = 4; tab[i].makeup = 0; i++;
  34.     tab[i].word = "1100"; tab[i].len = 5; tab[i].makeup = 0; i++;
  35.     tab[i].word = "1110"; tab[i].len = 6; tab[i].makeup = 0; i++;
  36.     tab[i].word = "1111"; tab[i].len = 7; tab[i].makeup = 0; i++;
  37.     tab[i].word = "10011"; tab[i].len = 8; tab[i].makeup = 0; i++;
  38.     tab[i].word = "10100"; tab[i].len = 9; tab[i].makeup = 0; i++;
  39.     tab[i].word = "00111"; tab[i].len = 10; tab[i].makeup = 0; i++;
  40.     tab[i].word = "01000"; tab[i].len = 11; tab[i].makeup = 0; i++;
  41.     tab[i].word = "001000"; tab[i].len = 12; tab[i].makeup = 0; i++;
  42.     tab[i].word = "000011"; tab[i].len = 13; tab[i].makeup = 0; i++;
  43.     tab[i].word = "110100"; tab[i].len = 14; tab[i].makeup = 0; i++;
  44.     tab[i].word = "110101"; tab[i].len = 15; tab[i].makeup = 0; i++;
  45.     tab[i].word = "101010"; tab[i].len = 16; tab[i].makeup = 0; i++;
  46.     tab[i].word = "101011"; tab[i].len = 17; tab[i].makeup = 0; i++;
  47.     tab[i].word = "0100111"; tab[i].len = 18; tab[i].makeup = 0; i++;
  48.     tab[i].word = "0001100"; tab[i].len = 19; tab[i].makeup = 0; i++;
  49.     tab[i].word = "0001000"; tab[i].len = 20; tab[i].makeup = 0; i++;
  50.     tab[i].word = "0010111"; tab[i].len = 21; tab[i].makeup = 0; i++;
  51.     tab[i].word = "0000011"; tab[i].len = 22; tab[i].makeup = 0; i++;
  52.     tab[i].word = "0000100"; tab[i].len = 23; tab[i].makeup = 0; i++;
  53.     tab[i].word = "0101000"; tab[i].len = 24; tab[i].makeup = 0; i++;
  54.     tab[i].word = "0101011"; tab[i].len = 25; tab[i].makeup = 0; i++;
  55.     tab[i].word = "0010011"; tab[i].len = 26; tab[i].makeup = 0; i++;
  56.     tab[i].word = "0100100"; tab[i].len = 27; tab[i].makeup = 0; i++;
  57.     tab[i].word = "0011000"; tab[i].len = 28; tab[i].makeup = 0; i++;
  58.     tab[i].word = "00000010"; tab[i].len = 29; tab[i].makeup = 0; i++;
  59.     tab[i].word = "00000011"; tab[i].len = 30; tab[i].makeup = 0; i++;
  60.     tab[i].word = "00011010"; tab[i].len = 31; tab[i].makeup = 0; i++;
  61.     tab[i].word = "00011011"; tab[i].len = 32; tab[i].makeup = 0; i++;
  62.     tab[i].word = "00010010"; tab[i].len = 33; tab[i].makeup = 0; i++;
  63.     tab[i].word = "00010011"; tab[i].len = 34; tab[i].makeup = 0; i++;
  64.     tab[i].word = "00010100"; tab[i].len = 35; tab[i].makeup = 0; i++;
  65.     tab[i].word = "00010101"; tab[i].len = 36; tab[i].makeup = 0; i++;
  66.     tab[i].word = "00010110"; tab[i].len = 37; tab[i].makeup = 0; i++;
  67.     tab[i].word = "00010111"; tab[i].len = 38; tab[i].makeup = 0; i++;
  68.     tab[i].word = "00101000"; tab[i].len = 39; tab[i].makeup = 0; i++;
  69.     tab[i].word = "00101001"; tab[i].len = 40; tab[i].makeup = 0; i++;
  70.     tab[i].word = "00101010"; tab[i].len = 41; tab[i].makeup = 0; i++;
  71.     tab[i].word = "00101011"; tab[i].len = 42; tab[i].makeup = 0; i++;
  72.     tab[i].word = "00101100"; tab[i].len = 43; tab[i].makeup = 0; i++;
  73.     tab[i].word = "00101101"; tab[i].len = 44; tab[i].makeup = 0; i++;
  74.     tab[i].word = "00000100"; tab[i].len = 45; tab[i].makeup = 0; i++;
  75.     tab[i].word = "00000101"; tab[i].len = 46; tab[i].makeup = 0; i++;
  76.     tab[i].word = "00001010"; tab[i].len = 47; tab[i].makeup = 0; i++;
  77.     tab[i].word = "00001011"; tab[i].len = 48; tab[i].makeup = 0; i++;
  78.     tab[i].word = "01010010"; tab[i].len = 49; tab[i].makeup = 0; i++;
  79.     tab[i].word = "01010011"; tab[i].len = 50; tab[i].makeup = 0; i++;
  80.     tab[i].word = "01010100"; tab[i].len = 51; tab[i].makeup = 0; i++;
  81.     tab[i].word = "01010101"; tab[i].len = 52; tab[i].makeup = 0; i++;
  82.     tab[i].word = "00100100"; tab[i].len = 53; tab[i].makeup = 0; i++;
  83.     tab[i].word = "00100101"; tab[i].len = 54; tab[i].makeup = 0; i++;
  84.     tab[i].word = "01011000"; tab[i].len = 55; tab[i].makeup = 0; i++;
  85.     tab[i].word = "01011001"; tab[i].len = 56; tab[i].makeup = 0; i++;
  86.     tab[i].word = "01011010"; tab[i].len = 57; tab[i].makeup = 0; i++;
  87.     tab[i].word = "01011011"; tab[i].len = 58; tab[i].makeup = 0; i++;
  88.     tab[i].word = "01001010"; tab[i].len = 59; tab[i].makeup = 0; i++;
  89.     tab[i].word = "01001011"; tab[i].len = 60; tab[i].makeup = 0; i++;
  90.     tab[i].word = "00110010"; tab[i].len = 61; tab[i].makeup = 0; i++;
  91.     tab[i].word = "00110011"; tab[i].len = 62; tab[i].makeup = 0; i++;
  92.     tab[i].word = "00110100"; tab[i].len = 63; tab[i].makeup = 0; i++;
  93.     tab[i].word = "11011"; tab[i].len = 64; tab[i].makeup = 1; i++;
  94.     tab[i].word = "10010"; tab[i].len = 128; tab[i].makeup = 1; i++;
  95.     tab[i].word = "010111"; tab[i].len = 192; tab[i].makeup = 1; i++;
  96.     tab[i].word = "0110111"; tab[i].len = 256; tab[i].makeup = 1; i++;
  97.     tab[i].word = "00110110"; tab[i].len = 320; tab[i].makeup = 1; i++;
  98.     tab[i].word = "00110111"; tab[i].len = 384; tab[i].makeup = 1; i++;
  99.     tab[i].word = "01100100"; tab[i].len = 448; tab[i].makeup = 1; i++;
  100.     tab[i].word = "01100101"; tab[i].len = 512; tab[i].makeup = 1; i++;
  101.     tab[i].word = "01101000"; tab[i].len = 576; tab[i].makeup = 1; i++;
  102.     tab[i].word = "01100111"; tab[i].len = 640; tab[i].makeup = 1; i++;
  103.     tab[i].word = "011001100"; tab[i].len = 704; tab[i].makeup = 1; i++;
  104.     tab[i].word = "011001101"; tab[i].len = 768; tab[i].makeup = 1; i++;
  105.     tab[i].word = "011010010"; tab[i].len = 832; tab[i].makeup = 1; i++;
  106.     tab[i].word = "011010011"; tab[i].len = 896; tab[i].makeup = 1; i++;
  107.     tab[i].word = "011010100"; tab[i].len = 960; tab[i].makeup = 1; i++;
  108.     tab[i].word = "011010101"; tab[i].len = 1024; tab[i].makeup = 1; i++;
  109.     tab[i].word = "011010110"; tab[i].len = 1088; tab[i].makeup = 1; i++;
  110.     tab[i].word = "011010111"; tab[i].len = 1152; tab[i].makeup = 1; i++;
  111.     tab[i].word = "011011000"; tab[i].len = 1216; tab[i].makeup = 1; i++;
  112.     tab[i].word = "011011001"; tab[i].len = 1280; tab[i].makeup = 1; i++;
  113.     tab[i].word = "011011010"; tab[i].len = 1344; tab[i].makeup = 1; i++;
  114.     tab[i].word = "011011011"; tab[i].len = 1408; tab[i].makeup = 1; i++;
  115.     tab[i].word = "010011000"; tab[i].len = 1472; tab[i].makeup = 1; i++;
  116.     tab[i].word = "010011001"; tab[i].len = 1536; tab[i].makeup = 1; i++;
  117.     tab[i].word = "010011010"; tab[i].len = 1600; tab[i].makeup = 1; i++;
  118.     tab[i].word = "011000"; tab[i].len = 1664; tab[i].makeup = 1; i++;
  119.     tab[i].word = "010011011"; tab[i].len = 1728; tab[i].makeup = 1; i++;
  120.     /* extended make up codes (are these standard?) */
  121.     tab[i].word = "00000001000"; tab[i].len = 1792; tab[i].makeup = 1; i++;
  122.     tab[i].word = "00000001100"; tab[i].len = 1856; tab[i].makeup = 1; i++;
  123.     tab[i].word = "00000001101"; tab[i].len = 1920; tab[i].makeup = 1; i++;
  124.     tab[i].word = "000000010010"; tab[i].len = 1984; tab[i].makeup = 1; i++;
  125.     tab[i].word = "000000010011"; tab[i].len = 2048; tab[i].makeup = 1; i++;
  126.     tab[i].word = "000000010100"; tab[i].len = 2112; tab[i].makeup = 1; i++;
  127.     tab[i].word = "000000010101"; tab[i].len = 2176; tab[i].makeup = 1; i++;
  128.     tab[i].word = "000000010110"; tab[i].len = 2240; tab[i].makeup = 1; i++;
  129.     tab[i].word = "000000010111"; tab[i].len = 2304; tab[i].makeup = 1; i++;
  130.     tab[i].word = "000000011100"; tab[i].len = 2368; tab[i].makeup = 1; i++;
  131.     tab[i].word = "000000011101"; tab[i].len = 2432; tab[i].makeup = 1; i++;
  132.     tab[i].word = "000000011110"; tab[i].len = 2496; tab[i].makeup = 1; i++;
  133.     tab[i].word = "000000011111"; tab[i].len = 2560; tab[i].makeup = 1; i++;
  134.     tab[i].word = 0; tab[i].len = 0; tab[i].makeup = 0;
  135. }
  136.  
  137. /* black terminating and makeup codes */
  138. static void
  139. makebtab(struct t4word tab[])
  140. {
  141.     int i = 0;
  142.     tab[i].word = "0000110111"; tab[i].len = 0; tab[i].makeup = 0; i++;
  143.     tab[i].word = "010"; tab[i].len = 1; tab[i].makeup = 0; i++;
  144.     tab[i].word = "11"; tab[i].len = 2; tab[i].makeup = 0; i++;
  145.     tab[i].word = "10"; tab[i].len = 3; tab[i].makeup = 0; i++;
  146.     tab[i].word = "011"; tab[i].len = 4; tab[i].makeup = 0; i++;
  147.     tab[i].word = "0011"; tab[i].len = 5; tab[i].makeup = 0; i++;
  148.     tab[i].word = "0010"; tab[i].len = 6; tab[i].makeup = 0; i++;
  149.     tab[i].word = "00011"; tab[i].len = 7; tab[i].makeup = 0; i++;
  150.     tab[i].word = "000101"; tab[i].len = 8; tab[i].makeup = 0; i++;
  151.     tab[i].word = "000100"; tab[i].len = 9; tab[i].makeup = 0; i++;
  152.     tab[i].word = "0000100"; tab[i].len = 10; tab[i].makeup = 0; i++;
  153.     tab[i].word = "0000101"; tab[i].len = 11; tab[i].makeup = 0; i++;
  154.     tab[i].word = "0000111"; tab[i].len = 12; tab[i].makeup = 0; i++;
  155.     tab[i].word = "00000100"; tab[i].len = 13; tab[i].makeup = 0; i++;
  156.     tab[i].word = "00000111"; tab[i].len = 14; tab[i].makeup = 0; i++;
  157.     tab[i].word = "000011000"; tab[i].len = 15; tab[i].makeup = 0; i++;
  158.     tab[i].word = "0000010111"; tab[i].len = 16; tab[i].makeup = 0; i++;
  159.     tab[i].word = "0000011000"; tab[i].len = 17; tab[i].makeup = 0; i++;
  160.     tab[i].word = "0000001000"; tab[i].len = 18; tab[i].makeup = 0; i++;
  161.     tab[i].word = "00001100111"; tab[i].len = 19; tab[i].makeup = 0; i++;
  162.     tab[i].word = "00001101000"; tab[i].len = 20; tab[i].makeup = 0; i++;
  163.     tab[i].word = "00001101100"; tab[i].len = 21; tab[i].makeup = 0; i++;
  164.     tab[i].word = "00000110111"; tab[i].len = 22; tab[i].makeup = 0; i++;
  165.     tab[i].word = "00000101000"; tab[i].len = 23; tab[i].makeup = 0; i++;
  166.     tab[i].word = "00000010111"; tab[i].len = 24; tab[i].makeup = 0; i++;
  167.     tab[i].word = "00000011000"; tab[i].len = 25; tab[i].makeup = 0; i++;
  168.     tab[i].word = "000011001010"; tab[i].len = 26; tab[i].makeup = 0; i++;
  169.     tab[i].word = "000011001011"; tab[i].len = 27; tab[i].makeup = 0; i++;
  170.     tab[i].word = "000011001100"; tab[i].len = 28; tab[i].makeup = 0; i++;
  171.     tab[i].word = "000011001101"; tab[i].len = 29; tab[i].makeup = 0; i++;
  172.     tab[i].word = "000001101000"; tab[i].len = 30; tab[i].makeup = 0; i++;
  173.     tab[i].word = "000001101001"; tab[i].len = 31; tab[i].makeup = 0; i++;
  174.     tab[i].word = "000001101010"; tab[i].len = 32; tab[i].makeup = 0; i++;
  175.     tab[i].word = "000001101011"; tab[i].len = 33; tab[i].makeup = 0; i++;
  176.     tab[i].word = "000011010010"; tab[i].len = 34; tab[i].makeup = 0; i++;
  177.     tab[i].word = "000011010011"; tab[i].len = 35; tab[i].makeup = 0; i++;
  178.     tab[i].word = "000011010100"; tab[i].len = 36; tab[i].makeup = 0; i++;
  179.     tab[i].word = "000011010101"; tab[i].len = 37; tab[i].makeup = 0; i++;
  180.     tab[i].word = "000011010110"; tab[i].len = 38; tab[i].makeup = 0; i++;
  181.     tab[i].word = "000011010111"; tab[i].len = 39; tab[i].makeup = 0; i++;
  182.     tab[i].word = "000001101100"; tab[i].len = 40; tab[i].makeup = 0; i++;
  183.     tab[i].word = "000001101101"; tab[i].len = 41; tab[i].makeup = 0; i++;
  184.     tab[i].word = "000011011010"; tab[i].len = 42; tab[i].makeup = 0; i++;
  185.     tab[i].word = "000011011011"; tab[i].len = 43; tab[i].makeup = 0; i++;
  186.     tab[i].word = "000001010100"; tab[i].len = 44; tab[i].makeup = 0; i++;
  187.     tab[i].word = "000001010101"; tab[i].len = 45; tab[i].makeup = 0; i++;
  188.     tab[i].word = "000001010110"; tab[i].len = 46; tab[i].makeup = 0; i++;
  189.     tab[i].word = "000001010111"; tab[i].len = 47; tab[i].makeup = 0; i++;
  190.     tab[i].word = "000001100100"; tab[i].len = 48; tab[i].makeup = 0; i++;
  191.     tab[i].word = "000001100101"; tab[i].len = 49; tab[i].makeup = 0; i++;
  192.     tab[i].word = "000001010010"; tab[i].len = 50; tab[i].makeup = 0; i++;
  193.     tab[i].word = "000001010011"; tab[i].len = 51; tab[i].makeup = 0; i++;
  194.     tab[i].word = "000000100100"; tab[i].len = 52; tab[i].makeup = 0; i++;
  195.     tab[i].word = "000000110111"; tab[i].len = 53; tab[i].makeup = 0; i++;
  196.     tab[i].word = "000000111000"; tab[i].len = 54; tab[i].makeup = 0; i++;
  197.     tab[i].word = "000000100111"; tab[i].len = 55; tab[i].makeup = 0; i++;
  198.     tab[i].word = "000000101000"; tab[i].len = 56; tab[i].makeup = 0; i++;
  199.     tab[i].word = "000001011000"; tab[i].len = 57; tab[i].makeup = 0; i++;
  200.     tab[i].word = "000001011001"; tab[i].len = 58; tab[i].makeup = 0; i++;
  201.     tab[i].word = "000000101011"; tab[i].len = 59; tab[i].makeup = 0; i++;
  202.     tab[i].word = "000000101100"; tab[i].len = 60; tab[i].makeup = 0; i++;
  203.     tab[i].word = "000001011010"; tab[i].len = 61; tab[i].makeup = 0; i++;
  204.     tab[i].word = "000001100110"; tab[i].len = 62; tab[i].makeup = 0; i++;
  205.     tab[i].word = "000001100111"; tab[i].len = 63; tab[i].makeup = 0; i++;
  206.     tab[i].word = "0000001111"; tab[i].len = 64; tab[i].makeup = 1; i++;
  207.     tab[i].word = "000011001000"; tab[i].len = 128; tab[i].makeup = 1; i++;
  208.     tab[i].word = "000011001001"; tab[i].len = 192; tab[i].makeup = 1; i++;
  209.     tab[i].word = "000001011011"; tab[i].len = 256; tab[i].makeup = 1; i++;
  210.     tab[i].word = "000000110011"; tab[i].len = 320; tab[i].makeup = 1; i++;
  211.     tab[i].word = "000000110100"; tab[i].len = 384; tab[i].makeup = 1; i++;
  212.     tab[i].word = "000000110101"; tab[i].len = 448; tab[i].makeup = 1; i++;
  213.     tab[i].word = "0000001101100"; tab[i].len = 512; tab[i].makeup = 1; i++;
  214.     tab[i].word = "0000001101101"; tab[i].len = 576; tab[i].makeup = 1; i++;
  215.     tab[i].word = "0000001001010"; tab[i].len = 640; tab[i].makeup = 1; i++;
  216.     tab[i].word = "0000001001011"; tab[i].len = 704; tab[i].makeup = 1; i++;
  217.     tab[i].word = "0000001001100"; tab[i].len = 768; tab[i].makeup = 1; i++;
  218.     tab[i].word = "0000001001101"; tab[i].len = 832; tab[i].makeup = 1; i++;
  219.     tab[i].word = "0000001110010"; tab[i].len = 896; tab[i].makeup = 1; i++;
  220.     tab[i].word = "0000001110011"; tab[i].len = 960; tab[i].makeup = 1; i++;
  221.     tab[i].word = "0000001110100"; tab[i].len = 1024; tab[i].makeup = 1; i++;
  222.     tab[i].word = "0000001110101"; tab[i].len = 1088; tab[i].makeup = 1; i++;
  223.     tab[i].word = "0000001110110"; tab[i].len = 1152; tab[i].makeup = 1; i++;
  224.     tab[i].word = "0000001110111"; tab[i].len = 1216; tab[i].makeup = 1; i++;
  225.     tab[i].word = "0000001010010"; tab[i].len = 1280; tab[i].makeup = 1; i++;
  226.     tab[i].word = "0000001010011"; tab[i].len = 1344; tab[i].makeup = 1; i++;
  227.     tab[i].word = "0000001010100"; tab[i].len = 1408; tab[i].makeup = 1; i++;
  228.     tab[i].word = "0000001010101"; tab[i].len = 1472; tab[i].makeup = 1; i++;
  229.     tab[i].word = "0000001011010"; tab[i].len = 1536; tab[i].makeup = 1; i++;
  230.     tab[i].word = "0000001011011"; tab[i].len = 1600; tab[i].makeup = 1; i++;
  231.     tab[i].word = "0000001100100"; tab[i].len = 1664; tab[i].makeup = 1; i++;
  232.     tab[i].word = "0000001100101"; tab[i].len = 1728; tab[i].makeup = 1; i++;
  233.      /* extended make up codes (are these standard?) */
  234.     tab[i].word = "00000001000"; tab[i].len = 1792; tab[i].makeup = 1; i++;
  235.     tab[i].word = "00000001100"; tab[i].len = 1856; tab[i].makeup = 1; i++;
  236.     tab[i].word = "00000001101"; tab[i].len = 1920; tab[i].makeup = 1; i++;
  237.     tab[i].word = "000000010010"; tab[i].len = 1984; tab[i].makeup = 1; i++;
  238.     tab[i].word = "000000010011"; tab[i].len = 2048; tab[i].makeup = 1; i++;
  239.     tab[i].word = "000000010100"; tab[i].len = 2112; tab[i].makeup = 1; i++;
  240.     tab[i].word = "000000010101"; tab[i].len = 2176; tab[i].makeup = 1; i++;
  241.     tab[i].word = "000000010110"; tab[i].len = 2240; tab[i].makeup = 1; i++;
  242.     tab[i].word = "000000010111"; tab[i].len = 2304; tab[i].makeup = 1; i++;
  243.     tab[i].word = "000000011100"; tab[i].len = 2368; tab[i].makeup = 1; i++;
  244.     tab[i].word = "000000011101"; tab[i].len = 2432; tab[i].makeup = 1; i++;
  245.     tab[i].word = "000000011110"; tab[i].len = 2496; tab[i].makeup = 1; i++;
  246.     tab[i].word = "000000011111"; tab[i].len = 2560; tab[i].makeup = 1; i++;
  247.     tab[i].word = 0; tab[i].len = 0; tab[i].makeup = 0;
  248. }
  249.  
  250. struct t4table *t4table[2]; /* white is 0 and black is 1 */
  251. long t4tablelen[2];
  252.  
  253. static OSErr InitOne(struct t4word in[], struct t4table **out, long *outlen);
  254.  
  255. OSErr
  256. InitT4Tables()
  257. {
  258.     struct t4table *tbl;
  259.     long len;
  260.     struct t4word tab[200];
  261.     
  262.     makewtab(tab);
  263.     if(InitOne(tab, &tbl, &len) != 0)
  264.         return(-1);
  265.     t4table[0] = tbl;
  266.     t4tablelen[0] = len;
  267.     makebtab(tab);
  268.     if(InitOne(tab, &tbl, &len) != 0){
  269.         DisposPtr(t4table[0]);
  270.         return(-1);
  271.     }
  272.     t4table[1] = tbl;
  273.     t4tablelen[1] = len;
  274.     return(0);
  275. }
  276.  
  277. /* convert an ascii binary string into a number */
  278. static long
  279. btoi(char s[])
  280. {
  281.     short i;
  282.     long x;
  283.     
  284.     x = 0;
  285.     for(i = 0; s[i]; i++){
  286.         x <<= 1;
  287.         x |= (s[i] == '0' ? 0 : 1);
  288.     }
  289.     return(x);
  290. }
  291.  
  292. static OSErr
  293. InitOne(struct t4word in[], struct t4table **out, long *outlen)
  294. {
  295.     struct t4table *t = 0;
  296.     long tlen;
  297.     long ini, outi;
  298.     long next; /* next free slot in t[] */
  299.     short nbits, bitno, bit;
  300.     
  301.     *out = 0;
  302.     *outlen = -1;
  303.     
  304.     /*
  305.      * calculate required output table size.
  306.      */
  307.     tlen = 0;
  308.     for(ini = 0; in[ini].word; ini++){
  309.         outi = btoi(in[ini].word);
  310.         if(outi >= tlen)
  311.             tlen = outi + 1;
  312.     }
  313.     
  314.     if(tlen > 8192){
  315.         /* on0 and on1 fields cannot fit such large indices */
  316.         return(-1);
  317.     }
  318.     
  319.     t = (struct t4table *) NewPtr(sizeof(struct t4table) * tlen);
  320.     if(t == 0)
  321.         return(-1);
  322.         
  323.     for(outi = 0; outi < tlen; outi++){
  324.         t[outi].terminating = 0;
  325.         t[outi].makeup = 0;
  326.         t[outi].on0 = 0;
  327.         t[outi].on1 = 0;
  328.     }
  329.     
  330.     next = 1;
  331.     for(ini = 0; in[ini].word; ini++){
  332.         /* set up the binary tree path to this word */
  333.         nbits = strlen(in[ini].word);
  334.         outi = 0;
  335.         for(bitno = 0; bitno < nbits; bitno++){
  336.             if(next >= tlen)
  337.                 goto bad;
  338.             bit = (in[ini].word[bitno] == '1' ? 1 : 0);
  339.             if(bit){
  340.                 if(t[outi].on1 == 0)
  341.                     t[outi].on1 = next++;
  342.                 outi = t[outi].on1;
  343.             } else {
  344.                 if(t[outi].on0 == 0)
  345.                     t[outi].on0 = next++;
  346.                 outi = t[outi].on0;
  347.             }
  348.             if(outi < 0 || outi >= tlen)
  349.                 goto bad;
  350.             if(t[outi].terminating || t[outi].makeup)
  351.                 goto bad;
  352.         }
  353.         
  354.         /* set up this word itself */
  355.         if(in[ini].makeup)
  356.             t[outi].makeup = 1;
  357.         else
  358.             t[outi].terminating = 1;
  359.         t[outi].on0 = in[ini].len;
  360.         if(t[outi].on0 != in[ini].len) /* does it fit in the field? */
  361.             goto bad;
  362.     }
  363.     
  364.     *out = t;
  365.     *outlen = tlen;
  366.     return(0);
  367. bad:
  368.     if(t)
  369.         DisposPtr(t);
  370.     return(-1);
  371. }
  372.  
  373. void
  374. FreeT4Tables()
  375. {
  376.     if(t4table[0])
  377.         DisposPtr(t4table[0]);
  378.     if(t4table[1])
  379.         DisposPtr(t4table[1]);
  380.     t4table[0] = t4table[1] = 0;
  381. }